import json
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
# Create your views here.
from book_drf.serializers import BooksSerialzier
from books.models import BookInfo


class BooksDRF(GenericAPIView):
    """
        获取所有图书和保存图书
    """
    serializer_class = BooksSerialzier  # 指定当前视图使用那个序列化器
    queryset = BookInfo.objects.all()  # 指定当前视图使用那个查询集数据对象

    def get(self, request):
        print(request.query_params)#http://www.meiduo.site:8000/books_drf_generic/?a =10  和request.GET 方法一样接受浏览器
        # ---<QueryDict: {'a ': ['10']}>
        # 1、查询所有图书s
        books = self.get_queryset()  # 获取查询集数据

        # 2、返回图书数据
        ser = self.get_serializer(books, many=True)  # 获取指定的序列化器对象

        return Response(ser.data)
#调用查询方法,查询的数据,2,构建序列化器对象,返回数据
    def post(self, request):
        # 1、获取前端数据
        data = request.data
        # data = request.query_params 只接受字符串
        # 2、验证数据
        ser = self.get_serializer(data=data)
        ser.is_valid(raise_exception=True)

        # # 3、保存数据
        ser.save()
        # # 4、返回结果

        return Response(ser.data)
#保存数据,1,接受数据 2,构建序列化器对象,用序列化器对象验证数据,3,保存数据 4,返回数据

class BookDRF(GenericAPIView):
    """
        获取单一图书和修改删除
    """
    serializer_class = BooksSerialzier  # 指定当前视图使用那个序列化器,serializer_class 和queryset 不你更改,固定
    queryset = BookInfo.objects.all()  # 指定当前视图使用那个查询集数据对象

    def get(self, requst, pk):

        book = self.get_object()  # 获取查询集中的一个单一数据对象,当查询多个数据的时候用get_queryset,并且自己接受pk值
        ser = self.get_serializer(book) #调用查询集和调用序列化,实际是在调用指定的对象属性
        # 返回数据
        return Response(ser.data)

    def put(self, request, pk):
        # 1、获取前端数据
        # data = request.body.decode()
        # data_dict = json.loads(data)
        data = request.data  # 接受修改的数据
        # 2、验证数据
        # 查询数据
        try:
            # book = BookInfo.objects.get(id=pk)
            book = self.get_object()
        except:

            return Response({'error': '数据错误'}, status=400)
        ser = self.get_serializer(book, data=data)
        ser.is_valid(raise_exception=True)
        # 3、更新数据
        ser.save()
        # 4、返回结果
        return Response(ser.data)

    def delete(self, request, pk):
        # 1、查询数据
        try:
            book = BookInfo.objects.get(id=pk)
        except:
            return Response({'error': '数据错误'}, status=400)

        book.is_delete = True
        book.save()
        return Response({'宝贝,你已经成功完成删除'})
